package 课上练习0421_scala

import 课上练习0421_scala.Point1.x

import java.lang.reflect.Method

/*
 * 泛型
 * [B <: A] upper bounds 上限或上界：B类型的上界是A类型，也就是B类型的⽗类是A类型
 * [B >: A] lower bounds 下限或下界：B类型的下界是A类型，也就是B类型的⼦类是A类型
 * [B <% A] view bounds 视界：表示B类型要转换为A类型，需要⼀个隐式转换函数
 * [B : A] context bounds 上下⽂界定（⽤到了隐式参数的语法糖）：需要⼀个隐式转换的值
 * [-A]：逆变，作为参数类型。是指实现的参数类型是接⼝定义的参数类型的⽗类
 * [+B]：协变，作为返回类型。是指返回类型是接⼝定义返回类型的⼦类
 */
object Scala_06_Generic {

  def main(args: Array[String]): Unit = {
    println("main")

      val p1 = Point1     //Point1$，单例，没走apply，只能.x
      val p2 = Point1  //Point1
      val p3 = new Point1(2)//Point1，只能.y
      val p4 = Point1(2)  //Point1，走apply(等于Point1.apply(2))，只能.y
      println(p1 == p2) // true
      println(p3 == p4) // false
    //  val s1 = Student("张三", Student.SCHOOL_NAME)
    ////  println(Int.getClass.as)
    //  p3.getClass.getMethods.foreach(println)
    //  val x1: Method = p3.getClass.getMethod("x")
    //  println(x1.invoke(null))
  }


}

class Point1(var y: Int) {
  {
    // 在构造函数中
    println("-=-=-=")
    println("0000000")
  }
}

object Point1 {
  var x = 10
  def apply(y: Int): Point1 = new Point1(y)

  {
    // 静态代码块
    println("-=-=-=")
    println("0000000")
  }
}


case class Student(var name: String, var school: String)  // 自动重写apply方法

object Student {
  val SCHOOL_NAME = "千峰教育"
}
